/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package util.log;

import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import util.exception.ExceptionUtil;

/**
 *
 * @author rdelacruz
 */
public abstract class MiLogger {
    
    protected static final MiLoggerProperties properties = new MiLoggerProperties();
    
    private static final MiLoggerConsola loggerConsola = new MiLoggerConsola();
    
    private final List<MiLogger> loggersAdicionales = new ArrayList<MiLogger>();

    public static MiLoggerProperties getProperties() {
        return properties;
    }
    
    protected MiLogger() {        
        
    }
        
    protected final static MiLogger getLogger() {
        return loggerConsola;
    }
    
    public static MiLogger getLogger(HttpServletResponse response, MiLogger loggerError) {
        MiLogger miLogger = new MiLoggerHtml(response, loggerError);        
        return miLogger;
        //return new LoggerHtml();
    }
    
    /*
    //PELIGROSO: porque se podrian crear varias instancias con un mismo handler
    public static MiLogger getLogger(FileHandler fileHandler) throws IOException {
        return new MiLoggerFile(fileHandler);
    } */  
    
    public void addLogger(MiLogger logger) {
        loggersAdicionales.add(logger);
    }
    
    public final MiLogger loge(Exception e) {
        loggerConsola.mostrar(e);
        mostrar(e);  
        for(MiLogger logger: loggersAdicionales) {
            logger.mostrar(e);
        }
        return this;
    }  
    
    public final MiLogger loge(String mensaje, Exception e) {
        return loge(new Exception(mensaje,e));               
    }
    
    public final MiLogger loge(String mensaje) {
        loggerConsola.mostrarLineaError(mensaje);
        mostrarLineaError(mensaje);
        for(MiLogger logger: loggersAdicionales) {
            logger.mostrarLineaError(mensaje);
        }
        return this;
    }
    
    public final MiLogger logd(String mensaje) {
        loggerConsola.mostrarLineaDebug(mensaje);
        
        //SOLO PARA MODO DEBUG:
        //if(writer!=null)
        //    writer.append(mensaje); 
        return this;
    }
    
    public final MiLogger logm(String mensaje, boolean mostrarEnLoggersAdicionales) {
        loggerConsola.mostrarLineaMensaje(mensaje);
        mostrarLineaMensaje(mensaje);
        if(mostrarEnLoggersAdicionales) {
            for(MiLogger logger: loggersAdicionales) {
                logger.mostrarLineaMensaje(mensaje);
            }
        }
        return this;
    }
    
    public final MiLogger logm(String mensaje) {        
        return logm(mensaje,true);
    }
    
    /**
     * Muestra solo mensaje, sin agregarle un prefijo
     * @param mensaje 
     */
    public void log(String mensaje) {
        loggerConsola.mostrarLinea(mensaje);
        mostrarLinea(mensaje);
        for(MiLogger logger: loggersAdicionales) {
            logger.mostrarLinea(mensaje);
        }
    }
    
    protected abstract void mostrarLinea(String texto);
    
    protected void mostrarLineaError(String mensaje) {
        mostrarLinea("ERROR: "+mensaje);
    }
    
    protected void mostrarLineaDebug(String mensaje) {
        mostrarLinea("DEBUG: "+mensaje);
    }
    
    protected void mostrarLineaMensaje(String mensaje) {
        //mostrarLinea("MENSAJE OK: "+mensaje);
        mostrarLinea("MENSAJE: "+mensaje);
    }
    
    protected void mostrar(Exception e) {
       mostrarLinea("ERROR: "+ExceptionUtil.getStackTrace(e));
    }

    

    
}
